﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
using TratamentoRIWikipedia.Indexacao;
using TratamentoRIWikipedia.processamento;

namespace TratamentoRIWikipedia.modelagem
{
    class ModeloBoleano
    {
        public static Dictionary<string, List<int>> indiceMemoriaPri = ModelagemGeral.LerIndiceMemoria();//Monta o indice na memoria principal 

        /// <summary>
        /// Processa o texto da busca e retorna o resultado
        /// </summary>
        /// <param name="TextoBuscado">Texto digitado no campo de busca</param>
        public static Dictionary<string, string> BuscaBinaria(string TextoBuscado)
        {
            List<List<int>> documentoEncontrados = new List<List<int>>();
            List<int> documentoEncontradosAux = new List<int>();
            List<int> documentoEncontradosFinal = new List<int>();
            bool buscaOR = false;
            ArrayList itensDaBusca;

            TextoBuscado = ModelagemGeral.preProcessaConsulta(TextoBuscado, out buscaOR, out itensDaBusca);

            Dictionary<string, string> resultadoBusca = new Dictionary<string, string>();

            //Verifica se tem mais de um item na busca
            if (itensDaBusca.Count > 1)
            {
                if (buscaOR)
                {
                    //OU pega item por item 
                    for (int i = 0; i < itensDaBusca.Count; i++)
                    {
                        //Verifica se a palavra existe no indice 
                        if (indiceMemoriaPri.ContainsKey(itensDaBusca[i].ToString()))
                        {
                            //Adiciona o id documento na palavra na lista final
                            documentoEncontrados.Add(indiceMemoriaPri[itensDaBusca[i].ToString()]);

                            //para cada documento encontrado 
                            for (int j = 0; j < documentoEncontrados.Count; j++)
                            {
                                foreach (int item in documentoEncontrados[j])
                                {
                                    if (!documentoEncontradosAux.Contains(item))
                                        documentoEncontradosAux.Add(item);
                                }
                            }
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < itensDaBusca.Count; i++)
                    {
                        //Verifica se a palavra existe no indice 
                        if (indiceMemoriaPri.ContainsKey(itensDaBusca[i].ToString()))
                        {
                            //Pega a lista de documento encontrados para o item 
                            documentoEncontrados.Add(indiceMemoriaPri[itensDaBusca[i].ToString()]);
                        }
                    }

                    if (documentoEncontradosAux.Count > 0)
                    {
                        documentoEncontradosAux = documentoEncontrados[0];
                        for (int i = 1; i < documentoEncontrados.Count; i++)
                        {
                            IEnumerable<int> inter = documentoEncontradosAux.Intersect(documentoEncontrados[i]);
                            foreach (int numero in inter)
                            {
                                documentoEncontradosFinal.Add(numero);
                            }

                            documentoEncontradosAux = documentoEncontradosFinal;
                            documentoEncontradosFinal = new List<int>();
                            inter = null;
                        }
                    }
                    else
                    {
                        return resultadoBusca;
                    }

                }

                resultadoBusca = ModelagemGeral.BuscaExibeDocMemoria(documentoEncontradosAux);
            }
            else
            {
                try
                {
                    //Verifica se a palavra existe no indice E também se ela já não ta no ArraydeResultado
                    if (indiceMemoriaPri.ContainsKey(TextoBuscado))
                    {
                        documentoEncontrados.Add(indiceMemoriaPri[TextoBuscado]);
                        resultadoBusca = ModelagemGeral.BuscaExibeDocMemoria(documentoEncontrados[0]);
                    }
                    else
                    {
                        return resultadoBusca;
                        //throw new Exception("Não encontramos nenhum resultado para busca: " + TextoBuscado);
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }

            }

            return resultadoBusca;
        }

    }
}
